package com.ufcg.lvc.client.my;

import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.util.EventHandler;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.events.DragMoveEvent;
import com.smartgwt.client.widgets.events.DragMoveHandler;
import com.smartgwt.client.widgets.events.DragStartEvent;
import com.smartgwt.client.widgets.events.DragStartHandler;
import com.smartgwt.client.widgets.events.DropEvent;
import com.smartgwt.client.widgets.events.DropHandler;
import com.smartgwt.client.widgets.events.ShowContextMenuEvent;
import com.smartgwt.client.widgets.events.ShowContextMenuHandler;
import com.ufcg.lvc.client.GreetingService;
import com.ufcg.lvc.client.GreetingServiceAsync;

/**
 * Esta classe representa uma página do fotolivro.
 * 
 * @author Larissa Nepomuceno Costa
 * @version 1
 * @since 08/10/2012
 */
public class MyPage extends Canvas {

	ArrayList<String> caminhosFotos;
	ArrayList<String> diagramacao = new ArrayList<String>();
	ArrayList<MyDropPhoto> dropFotos;
	int largura;
	int altura;

	public static GreetingServiceAsync getServico() {
		return GWT.create(GreetingService.class);
	}

	public MyPage(int largura, int altura) {

//		if (diagramacaoPag != null){
//			diagramacao = diagramacaoPag;
//			atualizarDiagramacao(diagramacaoPag);
//		}
		diagramacao = new ArrayList<String>();
		caminhosFotos = new ArrayList<String>();
		dropFotos = new ArrayList<MyDropPhoto>();
		setLargura(largura); // largura
		setAltura(altura); // altura
		// setShowEdges(true);
		// setEdgeSize(1);
		setOverflow(Overflow.HIDDEN);
		setCanAcceptDrop(true);
		setBackgroundColor("#000000");
		addShowContextMenuHandler(new ShowContextMenuHandler() {
			public void onShowContextMenu(ShowContextMenuEvent event) {
				event.cancel();
			}
		});
		// addDropOverHandler(new DropOverHandler() {
		// public void onDropOver(DropOverEvent event) {
		// setBackgroundColor("#f68a8a");
		// }
		// });
		// addDropOutHandler(new DropOutHandler() {
		// public void onDropOut(DropOutEvent event) {
		// setBackgroundColor("#ffff80");
		// }
		// });
		addDropHandler(new DropHandler() {
			public void onDrop(DropEvent event) {
				String cor = EventHandler.getDragTarget().getBackgroundColor();

				if (cor != null) {

					setColor(cor);
				} else {
					String caminho = "C:\\Users\\larissa\\workspaceNOV\\Foto__\\war\\"+ (((Img) EventHandler.getDragTarget()).getSrc()).split("8888/")[1];
					caminhosFotos.add(caminho.replace("Thumb", "Fotos")); // Add caminho na lista
					getServico().gravarCaminhosFotosPagina(caminhosFotos,new AsyncCallback<Boolean>() {
						@Override
						public void onSuccess(Boolean result) {
						}

						@Override
						public void onFailure(Throwable caught) {
							System.out.println("OnFailure gravar caminhos");
						}
					});

					getServico().gerarDiagramacao(caminhosFotos.size() + 1,	getLargura(), getAltura(),new AsyncCallback<ArrayList<String>>() {
						@Override
						public void onSuccess(ArrayList<String> result) {
							for (MyDropPhoto foto : dropFotos) {
								if (contains(foto)) {
									removeChild(foto);
								}
							}

							diagramacao.clear();

							for (int i = 1; i < result.size(); i++) {
								MyDropPhoto foto = new MyDropPhoto(
										result.get(i).split(" ")[0]);

								diagramacao.add(result.get(i)); // C:\Users\lariss~1\workspaceNOV\Foto__\war\Fotos\4je3mq80es7eoacsko4w1.jpg
							
								foto.setLeft(result.get(i).split(" ")[1]);
								foto.setTop(result.get(i).split(" ")[2]);
								foto.resizeTo(result.get(i).split(" ")[3],result.get(i).split(" ")[4]);
								dropFotos.add(foto);
								addChild(foto);
							}
						}

						@Override
						public void onFailure(Throwable caught) {
							System.out.println("OnFailure gerar diagramacao");
						}
					});
				}

				// addChild(new MyDropPhoto(caminho, getOffsetX()-15,
				// getOffsetY()-15));

				// addChild(new MyDropPhoto(a,getOffsetX() - 15 -
				// getEdgeSize(),getOffsetY() - 15 - getEdgeSize()));
			}
		});

		addDragStartHandler(new DragStartHandler() {
			@Override
			public void onDragStart(DragStartEvent event) {
				boolean start = event.isLeftButtonDown();
				start = !start;
			}
		});
		
		addDragMoveHandler(new DragMoveHandler() {
			@Override
			public void onDragMove(DragMoveEvent event) {
				boolean start = event.isLeftButtonDown();
				start = !start;
			}
		});
		
		addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				boolean start = event.isLeftButtonDown();
				start = !start;
			}
		});
	}

	public void setColor(String cor) {
		setBackgroundColor(cor);
	}

	public void setSize(String largura, String altura) {
		setWidth(largura);
		setHeight(altura);
	}

	public int getAltura() {
		return altura;
	}

	public void setAltura(int a) {
		setHeight(a);
		this.altura = a;
	}

	public int getLargura() {
		return largura;
	}

	public void setLargura(int l) {
		setWidth(l);
		this.largura = l;
	}

	public ArrayList<String> getDiagramacao() {
//		System.out.println("GD - "+ diagramacao.toString());
		return diagramacao;
	}
	
	public void limpar(){
		caminhosFotos.clear();
		diagramacao.clear();
		dropFotos.clear();
		Canvas[] filhos = this.getChildren();
		for (Canvas foto : filhos) {
			this.removeChild(foto);
		}
		getServico().gravarCaminhosFotosPagina(caminhosFotos,new AsyncCallback<Boolean>() {
			@Override
			public void onSuccess(Boolean result) {
//				System.out.println("Limpou a página");
			}

			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro: Não limpou a página");
			}
		});
	}
	
	public void atualizarDiagramacao(ArrayList<String> diagramacaoFotos){
		if (diagramacaoFotos.size() >= 1){
			diagramacao = diagramacaoFotos;
			caminhosFotos.clear();
			dropFotos.clear();
//			this.clear();
			Canvas[] filhos = this.getChildren();
			for (Canvas foto : filhos) {
				this.removeChild(foto);
			}
			
			for (String d : diagramacao) {
//				System.out.println( "Att - " + d);
				MyDropPhoto foto = new MyDropPhoto(d.split(" ")[0]);
				foto.setLeft(d.split(" ")[1]);
				foto.setTop(d.split(" ")[2]);
				foto.resizeTo(d.split(" ")[3],d.split(" ")[4]);
				caminhosFotos.add(d.split(" ")[0]);
				dropFotos.add(foto);
				addChild(foto);
			}
			getServico().gravarCaminhosFotosPagina(caminhosFotos,new AsyncCallback<Boolean>() {
				@Override
				public void onSuccess(Boolean result) {
//					System.out.println("Página atualizada");
				}

				@Override
				public void onFailure(Throwable caught) {
					System.out.println("Erro: Não atualizou a página");
				}
			});
		} else {
			limpar();
		}
	}

}